/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package interfacesGraficas;

import DTOs.DTOProducto;
import Fabricas.FabricaExpertos;
import entidadesNegocio.TipoProducto;
import excepciones.ExpertoProductosException;
import expertos.ExpertoProductos;
import interfacesGraficas.JDialogs.PantallaProductosNuevoProducto;
import interfacesGraficas.JDialogs.PantallaProductosNuevoTipoProd;
import interfacesGraficas.ModeloCombo.ModeloComboBoxTipoProducto;
import interfacesGraficas.ModeloTablas.ModeloTablaProductos;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author diego
 */
public class ControladorProductos extends Controlador {

    ExpertoProductos experto;
    PantallaProductos pantalla;
    PantallaProductosNuevoProducto pantallaNuevoProd;
    PantallaProductosNuevoTipoProd pantallaNuevoTipo;//Esta ventana tiene su comportamiento para evitar agregar complegidad al controlador
    ModeloTablaProductos modeloTabla;
    ModeloComboBoxTipoProducto modeloComboTipo;
    

    public ControladorProductos() {

        experto = (ExpertoProductos) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.PRODUCTOS);
        pantalla = new PantallaProductos();
        pantallaNuevoProd = new PantallaProductosNuevoProducto();
        pantallaNuevoProd.setLocationRelativeTo(null);

        modeloTabla = new ModeloTablaProductos();

        pantalla.getBtnNuevoTipoProd().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                nuevoTipoProducto();
            }
        });

        pantalla.getBtnNuevoProducto().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                nuevoProducto();
            }
        });

        /*****Pantalla nuevo Producto*******/
        pantallaNuevoProd.getBtnGuardar().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                guardarProducto();
            }
        });
    }

    @Override
    public void iniciar() {
        pantalla.setVisible(true);
        pantalla.getTblProductos().setModel(modeloTabla);
        try {
            pantalla.getCbxTipoProducto().setModel(new ModeloComboBoxTipoProducto(experto.buscarTipos()));
            ((ModeloComboBoxTipoProducto) pantalla.getCbxTipoProducto().getModel()).ordenar();
        } catch (ExpertoProductosException ex) {
            pantalla.getCbxTipoProducto().setModel(new ModeloComboBoxTipoProducto());
        }
        try {
            modeloTabla.setListaElementos(experto.buscarProducto(null));
        } catch (ExpertoProductosException ex) {
            System.out.println("No se han encontrado Productos");
        }
    }

    @Override
    public void finalizar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void continuar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    private void nuevoTipoProducto() {
        if (pantallaNuevoTipo == null) {
            pantallaNuevoTipo = new PantallaProductosNuevoTipoProd(this);
        }
        pantallaNuevoTipo.setVisible(true);
    }

    public boolean crearNuevoTipoProducto(String codigo, String nombreTipo) {
        boolean resultado = false;
        try {
            experto.crearNuevoTipoProducto(codigo, nombreTipo);

        } catch (ExpertoProductosException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        }
        JOptionPane.showMessageDialog(pantalla, "Tipo Guardado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        ((ModeloComboBoxTipoProducto) pantalla.getCbxTipoProducto().getModel()).agergarTipo(experto.buscarTipoxCodigo(codigo));
        ((ModeloComboBoxTipoProducto) pantalla.getCbxTipoProducto().getModel()).ordenar();

        resultado = true;
        return resultado;
    }
    
    public void seleccinarTipoProducto(TipoProducto tipo){
        experto.seleccionarTipo(tipo);
    }

    private void nuevoProducto() {
        pantallaNuevoProd.limpiar();
        pantallaNuevoProd.setVisible(true);
    }

    private void guardarProducto() {
        DTOProducto nuevoProducto = new DTOProducto(pantallaNuevoProd.getTxtCodigo().getText(), pantalla.getTxtNombreProd().getText(), pantallaNuevoProd.getCbxTipo().getSelectedItem().toString());
        try {
            //TODO: cambiar cuando se agreguen detalles al producto, se pueden pasar los datos al Experto a traves de un DTO
            experto.guardarProducto(nuevoProducto);
        } catch (ExpertoProductosException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        }
        JOptionPane.showMessageDialog(pantalla, "Producto Guardado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        try {
            modeloTabla.addRow(experto.buscarProducto(nuevoProducto));
        } catch (ExpertoProductosException ex) {
            System.out.println("ERROR al buscar ultimo producto guardado");
        }

    }

    public List<TipoProducto> buscarTiposProductos() {
        try {
            return experto.buscarTipos();
        } catch (ExpertoProductosException ex) {
            return null;
        }
    }
    
    public void eliminarTipoProducto(TipoProducto tipo){
        int seleccion = JOptionPane.showOptionDialog(
                    null,
                    "Esta seguro que desea eliminar Tipo de Producto: \n" + tipo.getNombretipoproducto() + ".",
                    "ELIMINAR TIPO Producto",
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null, // null para icono por defecto.
                    new Object[]{"Aceptar", "Cancelar"}, // null para YES, NO y CANCEL
                    "Cancelar");

            if (seleccion == 0) {
                try {
                    experto.eliminarTipoProducto(tipo);
                    JOptionPane.showMessageDialog(pantalla, "Tipo Producto Eliminado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                }
                ((ModeloComboBoxTipoProducto)pantalla.getCbxTipoProducto().getModel()).quitarTipo(tipo);
                ((ModeloComboBoxTipoProducto) pantalla.getCbxTipoProducto().getModel()).ordenar();
            }
    }
    
    public void guardarTipoProductos(List<TipoProducto> listaTipos){
        try {
            experto.guardarTipoProducto(listaTipos);
            ((ModeloComboBoxTipoProducto)pantalla.getCbxTipoProducto().getModel()).setListaCombo(experto.buscarTipos());
            ((ModeloComboBoxTipoProducto) pantalla.getCbxTipoProducto().getModel()).ordenar();
        } catch (ExpertoProductosException ex) {
              JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        
    }
}
